package com.winit.schedule.job.tracker.repository.mysql.dao;

import java.util.List;
import java.util.Map;

import com.winit.schedule.core.repository.entity.TaskItemEntity;
import com.winit.schedule.core.repository.query.TaskItemQuery;

public interface MysqlTaskItemDao {

    void saveTaskItem(TaskItemEntity taskitem);

    void updateTaskItem(TaskItemEntity taskitem);

    TaskItemEntity getTaskItemById(String taskItemId);

    void removeTaskItemByTaskId(String taskId);

    List<TaskItemEntity> getTaskItemsByTaskId(String taskId);

    void updateTaskRunnerForTaskItem(TaskItemEntity taskItem);

    /**
     * 根据tasktrackerId和status删除tasktrunner
     * 
     * @param String taskTrackerUuid, List<TaskItemStatus> taskItemStatus
     */
    void removeTaskRunnerByTaskTrackerUuid(Map<String, Object> params);

    /**
     * 根据tasktrackerId和status删除tasktrunner
     * 
     * @param List<String> taskTrackerUuid, List<TaskItemStatus> taskItemStatus
     */
    void removeTaskRunnerByTaskTrackerUuids(Map<String, Object> params);

    void updateTaskItemStatusByTaskRunnerUuid(Map<String, Object> params);

    /**
     * @param String taskId, List<TaskItemStatus> taskItemStatus
     */
    public List<TaskItemEntity> findRunningTaskItemsByTaskId(Map<String, Object> params);

    long findRunningTaskItemNumByTaskId(String taskId);

    /**
     * 将push失败的taskitem状态重置为INACTIVITE,
     * 
     * @param long timeout, List<TaskItemStatus> taskItemStatus
     */
    void recoveryPushFailureTaskItem(Map<String, Object> params);

    /**
     * @param List<String> taskIds, List<TaskItemStatus> taskItemStatus
     * @return
     */
    long findRunningTaskItemNumByTaskIds(Map<String, Object> params);

    /**
     * @param String jobId, List<TaskItemStatus> taskItemStatus
     * @return
     */
    long findRunningTaskItemNumByJobId(Map<String, Object> params);

    /**
     * @param JobID jobId, List<String> taskIds, long nextRunTime
     */
    void updateNextRunTime(Map<String, Object> params);

    /**
     * 根据任务ID查询可运行的任务项的数量
     * 
     * @param taskId
     * @return
     */
    long queryTaskItemNumByTaskId(String taskId, long currentTime);

    TaskItemEntity findRunnableTaskItemByTaskId(String taskId, long currentTime);

    int fetchRunnableTaskItemByTaskId(String taskItemId, String taskTrackerUuid, long currentTime, long nextRunTime);

    /**
     * 查询所有状态更新超时且在运行中的任务项
     * 
     * @param timeout 超时时间
     * @return
     */
    List<TaskItemEntity> queryTaskItemsByTimeout(TaskItemQuery query);

    /**
     * 根据超时时间和id恢复状态异常的任务项
     * 
     * @param timeout 超时时间
     * @param taskStatus 超时时间
     * @param ids taskItemId
     */
    void recoveryTaskItemByTimeoutAndIds(Map<String, Object> params);
    
    /**
     * 查询定时任务运行时间超过一定时长的任务
     * @param query
     * @return
     */
    List<TaskItemEntity> queryTaskItemsForLongtime(TaskItemQuery query);

}
